"""
模型层，用于存储和处理数据
"""


class House:
    __house_list = []  # 存所有的房子信息

    def __init__(self, title, total_price, position, area, estate):
        # 创建对象时，对每个对象添加id信息。
        # 没房子id为1；
        # 房子列表不为空，取所有所有房子id的最大值再加1
        # self.__id = max(self.__house_list, key=lambda  h: h.__id).__id + 1 if self.__house_list else 1

        if self.__house_list:
            # 1. 先找id最大的房子
            a_house = max(self.__house_list, key=lambda h: h.__id)
            # 2. 最大那套房子id加1，记为当前房子的id
            self.__id = a_house.__id + 1
        else:
            self.__id = 1

        self.__title = title  # 标题
        self.__total_price = total_price  # 总价格
        self.__position = position  # 地理位置
        self.__area = area  # 占地面积
        self.__estate = estate  # 小区名

    # 添加所有属性的getter方法
    @property
    def id(self):
        return self.__id

    @property
    def title(self):  # 标题
        return self.__title

    @property
    def total_price(self):  # 总价格
        return self.__total_price

    @property
    def position(self):  # 地理位置
        return self.__position

    @property
    def area(self):  # 占地面积
        return self.__area

    @property
    def estate(self):  # 小区名
        return self.__estate

    # 添加虚拟的单价属性
    @property
    def unit_price(self):  # 单价
        return self.__total_price / self.__area

    @classmethod
    def add_house(cls, title, total_price, position, area, estate):
        """添加新房源"""
        # 创建一个房子类型的对象
        a_house = cls(title, total_price, position, area, estate)
        # 放入列表
        cls.__house_list.append(a_house)

    @classmethod
    def get_house_list(cls):
        """返回所有房源信息的列表"""
        return cls.__house_list

    @classmethod
    def save_house_info(cls, filename='house.csv'):
        """保存房源信息，成功True，失败False"""
        try:
            with open(filename, 'w', encoding='gbk') as fw:
                # 遍历所有房子，将信息写入csv文件
                for a_house in cls.__house_list:
                    fw.write(str(a_house.id))
                    fw.write(',')
                    fw.write(a_house.title)
                    fw.write(',')
                    fw.write(str(a_house.total_price))
                    fw.write(',')
                    fw.write(a_house.position)
                    fw.write(',')
                    fw.write(str(a_house.area))
                    fw.write(',')
                    fw.write(a_house.estate)
                    fw.write('\r\n')  # 标准csv文件以'\r\n'为换行符
        except OSError:
            return False
        return True

    @classmethod
    def load_house_info(cls, filename='house.csv'):
        try:
            with open(filename, 'r', encoding='gbk') as fr:
                # 1. 清空原有的列表
                cls.__house_list.clear()
                # 2. 读文件内的数据，形成house对象，加入__house_list列表中
                for aline in fr:
                    # 去掉空白字符
                    aline = aline.strip()
                    # 以英文逗号拆分各个列，形成字符串的列表
                    info_s = aline.split(',')
                    id, title, total_price, position, area, estate = info_s

                    id = int(id)
                    total_price = float(total_price)
                    area = float(area)

                    a_house = cls(title, total_price, position, area, estate)
                    # 修改房子id
                    a_house.__id = id
                    cls.__house_list.append(a_house)
        except OSError:
            return False
        return True

    @classmethod
    def modify_house_total_price(cls, id, new_price):
        """修改id对应的房子总价"""
        if new_price < 0:
            return False
        # 查找id对应的房子
        for a_house in cls.__house_list:
            if id == a_house.id:  # 找到了
                a_house.__total_price = new_price
                return True
        return False  # 没找到

    @classmethod
    def remove_house(cls, id):
        """根据id删房子"""
        for index, a_house in enumerate(cls.__house_list):
            if id == a_house.id:
                del cls.__house_list[index]
                return True
        return False



if __name__ == '__main__':
    # House.add_house('回龙观3居室急售', 2000000, '北京', 120, '回龙观')
    # House.add_house('东方家园1居小户型', 1200000, '上海', 40, '东方家园')
    # House.add_house('东方家园2居小户型', 2200000, '重庆', 60, '东方家园')
    # House.save_house_info()
    House.load_house_info()
